home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
minix
/
up1510b.tgz
/
up1510b
/
src
/
lib
/
posix
/
readdir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-19
|
1KB
|
40 lines
/* readdir -- read next entry from a directory stream Author: D.A. Gwyn */
/* last edit: 25-Apr-1987 D A Gwyn */
#include <lib.h>
#include <dirent.h>
#include <stddef.h>
extern int getdents(); /* SVR3 system call, or emulation */
#define DULL (DIR *) NULL
#define CULL (char *) NULL
struct dirent *readdir(dirp)
register DIR *dirp; /* stream from opendir() */
{
register struct dirent *dp; /* -> directory data */
if (dirp == DULL || dirp->dd_buf == CULL || dirp->dd_magic != _DIR_MAGIC) {
errno = EBADF;
return( (struct dirent *) NULL); /* invalid pointer */
}
do {
if (dirp->dd_loc >= dirp->dd_size) /* empty or obsolete */
dirp->dd_loc = dirp->dd_size = 0;
if (dirp->dd_size == 0 /* need to refill buffer */
&& (dirp->dd_size =
getdents(dirp->dd_fd, dirp->dd_buf, (unsigned) _DIRBUF)) <= 0)
return((struct dirent *) NULL); /* EOF or error */
dp = (struct dirent *) & dirp->dd_buf[dirp->dd_loc];
dirp->dd_loc += dp->d_reclen;
}
while (dp->d_ino == 0); /* don't rely on getdents() */
return(dp);
}